#ifndef napyr2_Runtime_H
#define napyr2_Runtime_H

// *****************************************************************************************
//
// NAPYR2 (http://p-nand-q.com/python/napyr.html)
//
// Copyright (c) 2014, Gerson Kurz
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
// 
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
// 
// 2. Redistributions in binary form must reproduce the above copyright notice, this
//    list of conditions and the following disclaimer in the documentation and/or other
//    materials provided with the distribution.
// 
// 3. Neither the name of the copyright holder nor the names of its contributors may
//    be used to endorse or promote products derived from this software without
//    specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *****************************************************************************************

#include "napyr2.h"

namespace napyr2 // begins here.
{

class NAPYR2_API PythonModule;

class NAPYR2_API PythonRuntime 
	{
	public:
        PythonRuntime();
        virtual ~PythonRuntime();

	private:
		// not implemented - do not use
		PythonRuntime( const PythonRuntime& objectSrc );
		PythonRuntime& operator=( const PythonRuntime& objectSrc );

	public:
        PyObject* GetMainObject();

	public:
        bool Startup(
				LPCSTR lpszStartupPath, 
				LPCSTR lpszStartupScript,
				PythonModule* pStartupModule = NULL);

        void Cleanup();

		bool AddModule(PythonModule* module);
		
	public:
		bool IsInitialized() const
		{
			return m_bInitialized;
		}

	public:
        PyObject* DefineModule(LPCSTR name, PyMethodDef* methods, LPCSTR description);
    
    private:
        PyObject* m_pyMain;
        PyThreadState* m_pyThreadState;
        bool m_bInitialized;
	};

} // namespace napyr2 ends here.

#endif // napyr2_Runtime_H
